本章開始研究實際案例
由於省略掉了一些細節,無法進行實際測試。
不過經由範例程式碼的演示,可以清楚了解實現各功能所需的流程。
載點
https://dev.mysql.com/downloads/installer/
如果需要圖形化介面可以再下載MySQLWorkbench
建立資料庫
安裝完後會出現預設的MySQL 8.0 Command Line Client,進入後可以用命令列的方式建構資料庫。
確認DB伺服器是否運行中的指令:
mysqlshow -u <username> -p
另外也可以用MySQLWorkbench,以圖形化的方式建模。
MySQL建表的語法如下例,可以自己熟悉一下介面(本案例中不會實際取用DB內的資料):
create table user (
userName VARCHAR(20) NOT NULL,
pwd VARCHAR(20),
userId DOUBLE(5,2),
userRole CHAR(1),
PRIMARY KEY (userName) );
create table record (
buyId VARCHAR(28) NOT NULL,
userName VARCHAR(20),
buyTime date,
price DOUBLE(6,2),
PRIMARY KEY (buyId) ,
CONSTRAINT userName FOREIGN KEY (userName) REFERENCES mydb.user (userName));
create table order (
autoId BIGINT NOT NULL,
isbn VARCHAR(20),
buyId VARCHAR(28),
amount INT,
PRIMARY KEY (autoId) ,
CONSTRAINT isbn FOREIGN KEY (isbn) REFERENCES mydb.book (isbn),
CONSTRAINT buyId FOREIGN KEY (buyId) REFERENCES mydb.record (buyId));
create table book (
isbn VARCHAR(13) NOT NULL,
bookName VARCHAR(60),
PBHouse VARCHAR(50),
bookPrice DOUBLE(5,1),
PBTime date,
cover blob,
stock INT,
PRIMARY KEY (isbn) );
下載jar包
mysql-connector-java-8.0.23.jar 可以在MySQL資料夾找到此包:
(C:\Program Files (x86)\MySQL\Connector J 8.0)
jstl-api-1.2.jar
jstl-impl-1.2.jar
log4j 範例使用log4j-1.x.x.jar,到apache官網下載。
配置jar包
首先在IDE工具內確認一下自己的workplace,例如:
C:\Users\XXuser\Documents\workspace-spring-tool-suite-4-4.6.1.RELEASE
把jar包放在專案資料夾->WEB-INF->lib裡面
建立路徑
F5刷新一下專案頁面
專案點右鍵-> Build Path -> Libraries頁籤 -> Add JARs
伺服器在佈署專案時會依據web.xml來進行設定。
不過由於現在大多數的設定都可以用註解來代替了,
web.xml裡面只保留歡迎頁及設定metadata-complete="false"
(表示此處的配置信息不是完整的,請掃描class檔案的意思。)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0" metadata-complete="false">
<display-name>BookShop</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在src下新建log4j.properties
log4j.rootLogger=INFO,BB,AA
log4j.appender.AA=org.apache.log4j.ConsoleAppender
log4j.appender.AA.layout=org.apache.log4j.SimpleLayout
log4j.appender.BB=org.apache.log4j.FileAppender
log4j.appender.BB.File=book.log
log4j.appender.BB.layout=org.apache.log4j.PatternLayout
log4j.appender.BB.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m %n
創建Log物件是為了以後可以直接調用,不用每次都重新建立。
public class Log {
public static Logger logger = Logger.getLogger(Log.class.getName());
}
使用error()捕捉出錯訊息
try{
...
}catch(Exception e){
Log.logger.error(e.getMessage(),e);
}
使用info()丟出log訊息
Log.logger.info("Error msg");
在src下新增db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/資料庫名稱?useSSL=false
&serverTimezone=UTC&allowPublicKeyRetrieval=true
username=root
password=123456
使用JUNIT可以針對單一類進行測試,在class前面加上@Test,執行時選擇Run as->Junit Test
@Test
public void test() throws Exception {
testDBConnection(
"com.mysql.cj.jdbc.Driver",
"jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"root",
"123456");
}
public void testDBConnection(String driverClassName, String jdbcURL, String username, String password) throws ClassNotFoundException, SQLException {
Connection conn = DriverManager.getConnection(jdbcURL, username, password);
DatabaseMetaData metaData = conn.getMetaData();
System.out.println("連接的資料庫為:" + metaData.getDatabaseProductName() + "-" + metaData.getDatabaseProductVersion());
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(request instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest)request;
Object object = req.getSession().getAttribute("user");
if(object != null) {
chain.doFilter(request, response);
}else {
request.setAttribute("msg", "請先登錄");
req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
}
}
}
除了確認用戶存在DB之外,也確認是否有管理員權限。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
Object object = req.getSession().getAttribute("user");
if (object != null) {
TUser user = (TUser) object;
if (user.getRole() == IRole.ADMIN) {
chain.doFilter(request, response);
} else {
request.setAttribute("msg", "管理員才能訪問");
req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
}
} else {
request.setAttribute("msg", "請先登錄");
req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
}
}
將JSP頁面都放置到WEB-INF內,以避免用戶直接訪問。